/*
 * Copyright (c) 2016-2017 fulihui.com All right reserved
 * Project: user-core-201704XX
 * File name: UserUsedProducts.java
 */

package com.fulihui.usercore.enums;

import java.util.LinkedList;
import java.util.List;

/**
 * 16位预留二进制位标识16个产品，用位运算判断用户是否使用产品<p/>
 * 0000 0000 0000 0001 福礼惠<p/>
 * 0000 0000 0000 0010 耳朵资讯<p/>
 * @author Willard.Hu on 2017/4/5 0005.
 */
public enum UserUsedProducts {
    FULIHUI("0000000000000001"),
    ERDUO("0000000000000010");

    int value;

    UserUsedProducts(String bin) {
        this.value = Integer.parseInt(bin, 2);
    }

    public int getValue() {
        return value;
    }

    /**
     * 追加当前二进制位到并集中
     * @param unionOf 并集
     * @return 合并后的值
     */
    public int addOf(int unionOf) {
        return unionOf | this.getValue();
    }

    /**
     * 从二进制位中删除当前产品标识
     * @param unionOf 并集
     * @return 移除后的值
     */
    public int removeOf(int unionOf) {
        return unionOf ^ this.getValue();
    }

    /**
     * 判断是否在合集中
     * @param unionOf 并集
     * @return true / false
     */
    public boolean concat(int unionOf) {
        return (unionOf & this.getValue()) == this.getValue();
    }

    /**
     * 合集二进制转换成 UserUsedProducts 列表
     * @param unionOf 并集
     * @return UserUsedProducts 列表
     */
    public static List<UserUsedProducts> toList(int unionOf) {
        List<UserUsedProducts> list = new LinkedList<>();
        for (UserUsedProducts item : UserUsedProducts.values()) {
            if (item.concat(unionOf)) {
                list.add(item);
            }
        }
        return list;
    }

    /**
     * 获取所有 UserUsedProducts 列表的二进制并集
     * @param usedProducts UserUsedProducts 列表
     * @return 并集
     */
    public static int unionOf(List<UserUsedProducts> usedProducts) {
        if (usedProducts == null || usedProducts.isEmpty()) {
            throw new IllegalArgumentException("UsedProducts can not empty!");
        }
        int unionOf = 0;
        for (UserUsedProducts item : usedProducts) {
            unionOf |= item.getValue();
        }
        return unionOf;
    }

    /**
     * 通过枚举名查找
     * @param name 枚举名
     * @return {@link UserUsedProducts}
     */
    public static UserUsedProducts findByName(String name) {
        for (UserUsedProducts e : UserUsedProducts.values()) {
            if (e.name().equals(name)) {
                return e;
            }
        }
        return null;
    }
}
